package org.goj.practice.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.goj.common.entity.practice.Problem;
import org.goj.practice.dto.SimpleContestProblemDTO;
import org.goj.practice.vo.*;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.web.multipart.MultipartFile;

import java.io.OutputStream;
import java.util.List;

/**
 * <p>
 * 题目 服务类
 * </p>
 *
 * @author CK
 * @since 2020-12-02
 */
public interface ProblemService extends IService<Problem> {

    /**
     * 条件分页查询题目
     *
     * @param current        当前页
     * @param size           页面大小
     * @param classifyIdList 分类集合
     * @param sort           排序条件
     * @return Page<ProblemVO>
     * @author CK
     * @date 2020/12/9 9:56
     */
    Page<ProblemVO> getProblemConditionPage(Integer current, Integer size, List<Integer> classifyIdList, Integer sort, String name);

    /**
     * 管理员条件分页查询题目
     *
     * @param current        当前页
     * @param size           页面大小
     * @param classifyIdList 分类集合
     * @param sort           排序条件
     * @param name           题目编号|标题|描述
     * @return Page<ProblemAdminVO>
     * @author CK
     * @date 2021/3/24 10:25
     */
    Page<ProblemAdminVO> getProblemAdminPage(Integer current, Integer size, List<Integer> classifyIdList, Integer sort, String name);

    /**
     * 管理员添加题目
     *
     * @param problem 题目实体类
     * @return boolean
     * @author CK
     * @date 2021/3/25 18:36
     */
    boolean insertProblem(Problem problem);

    /**
     * 根据题目ID删除题目
     *
     * @param problemId 题目ID
     * @return boolean
     * @author CK
     * @date 2021/3/26 15:51
     */
    boolean deleteProblem(Integer problemId);

    /**
     * 管理员根据题目ID获取题目信息
     *
     * @param problemId 题目ID
     * @return ProblemDetailsAdminVO
     * @author CK
     * @date 2021/3/26 17:32
     */
    Problem getProblemAdminById(Integer problemId);

    /**
     * 管理员修改题目
     *
     * @param problem 题目实体类
     * @return boolean
     * @author CK
     * @date 2021/3/26 19:05
     */
    boolean updateProblem(Problem problem);

    /**
     * 根据题目ID获取测试数据
     *
     * @param problemId 题目ID
     * @return TestDataVO
     * @author CK
     * @date 2021/3/28 14:50
     */
    List<TestDataVO> getTestData(Integer problemId);

    /**
     * 根据数据名字前缀删除测试数据
     *
     * @param name      测试数据名
     * @param problemId 题目ID
     * @return boolean
     * @author CK
     * @date 2021/3/28 17:15
     */
    boolean deleteTestData(String name, Integer problemId);

    /**
     * 添加题目测试数据
     *
     * @param problemId      题目ID
     * @param name           名称
     * @param inputTestData  输入数据
     * @param outputTestData 输出数据
     * @return boolean
     * @author CK
     * @date 2021/3/28 18:16
     */
    boolean addTestData(Integer problemId, String name, String inputTestData, String outputTestData);

    /**
     * 根据名字获取对应的数据
     *
     * @param name      名字
     * @param problemId 题目ID
     * @return List<String>
     * @author CK
     * @date 2021/3/28 19:13
     */
    List<String> getTestDataByName(String name, Integer problemId);

    /**
     * 根据名字和题目ID更新数据
     *
     * @param problemId      题目ID
     * @param name           名字
     * @param inputTestData  输入数据
     * @param outputTestData 输出数据
     * @return boolean
     * @author CK
     * @date 2021/3/28 19:16
     */
    boolean updateTestDataByName(String name, Integer problemId, String inputTestData, String outputTestData);

    /**
     * 导入题目
     *
     * @param file 题目文件
     * @return boolean
     * @author CK
     * @date 2021/3/31 17:06
     */
    List<UploadProblemVO> uploadProblem(MultipartFile file);

    /**
     * 进入题目界面时查询竞赛列表
     *
     * @param contestId 竞赛ID
     * @return List<SimpleContestProblemDTO>
     * @author CK
     * @date 2021/4/24 20:49
     */
    List<SimpleContestProblemDTO> listSimpleContestProblemDTO(Integer contestId);

    /**
     * 查询简要题目数据
     *
     * @param current 当前页
     * @param size    所有页
     * @param sort    排序
     * @return Page<SimpleProblemVO>
     * @author CK
     * @date 2021/5/11 16:39
     */
    Page<SimpleProblemVO> pageSimpleProblem(Integer current, Integer size, Integer sort);

    /**
     * 下载题目
     *
     * @param problemIds 题目ID集合
     * @return void
     * @author CK
     * @date 2021/5/11 16:59
     */
    void downloadProblem(List<Integer> problemIds);
}
